coarse-grained multithreading